package com.gopay.bis.web.controller.ebank;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.axis.utils.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.gopay.bis.domain.order.OrderInfo;
import com.gopay.common.Result;
import com.gopay.common.constants.bank.BankConstants;
import com.gopay.common.constants.bank.KuaiQianConstants;
import com.gopay.common.domain.bank.BaseMessage;
import com.gopay.common.domain.bank.kuaiqian.ebank.KuaiQianResultMessage;
import com.ibm.icu.math.BigDecimal;

@Controller
@Scope("prototype")
public class KuaiQianServerRes extends BankResBase {
	 private static Log logger = LogFactory.getLog(KuaiQianServerRes.class);
	 @RequestMapping(value="/kuaiQianServerRes")
	@Override
	protected ModelAndView execute(HttpServletRequest request,
			HttpServletResponse response) {
		logger.error("--------------- 99BILLServerRes bankback  ---------------");
		return super.execute(request, response);
	}

	@Override
	protected BaseMessage buildMessage(HttpServletRequest request) {
		KuaiQianResultMessage resMsg = new KuaiQianResultMessage();
		// 设置成快钱通道
		// resMsg.setBankChannelCode(BankConstants.KUAIQIAN_CHANNEL);
		// 设置操作类型
		// resMsg.setOperType(BankConstants.VERIFY);
		// 人民币网关账号，该账号为11位人民币网关商户编号+01,该值与提交时相同。
		resMsg.setMerchantAcctId(request.getParameter("merchantAcctId"));
		// 网关版本，固定值：v2.0,该值与提交时相同。
		resMsg.setVersion(request.getParameter("version"));
		// 语言种类，1代表中文显示，2代表英文显示。默认为1,该值与提交时相同。
		resMsg.setLanguage(request.getParameter("language"));
		// 签名类型,该值为4，代表PKI加密方式,该值与提交时相同。
		resMsg.setSignType(request.getParameter("signType"));
		// 支付方式，一般为00，代表所有的支付方式。如果是银行直连商户，该值为10,该值与提交时相同。
		resMsg.setPayType(request.getParameter("payType"));
		// 银行代码，如果payType为00，该值为空；如果payType为10,该值与提交时相同。
		resMsg.setBankId(request.getParameter("bankId"));
		//系统银行代码
		resMsg.setBank(BankConstants.BANK_LOGO_KUAIQIAN);
		// 商户订单号，该值与提交时相同。
		resMsg.setOrderId(request.getParameter("orderId"));
		//发往银行订单号
		resMsg.setBankOrderId(request.getParameter("orderId"));
		// 订单提交时间，格式：yyyyMMddHHmmss，如：20071117020101,该值与提交时相同。
		resMsg.setOrderTime(request.getParameter("orderTime"));
		// 订单金额，金额以“分”为单位，商户测试以1分测试即可，切勿以大金额测试,该值与支付时相同。
		resMsg.setOrderAmount(request.getParameter("orderAmount"));
		// 快钱交易号，商户每一笔交易都会在快钱生成一个交易号。
		resMsg.setDealId(request.getParameter("dealId"));
		// 银行交易号 ，快钱交易在银行支付时对应的交易号，如果不是通过银行卡支付，则为空
		resMsg.setBankDealId(request.getParameter("bankDealId"));
		// 快钱交易时间，快钱对交易进行处理的时间,格式：yyyyMMddHHmmss，如：20071117020101
		resMsg.setDealTime(request.getParameter("dealTime"));
		// 商户实际支付金额 以分为单位。比方10元，提交时金额应为1000。该金额代表商户快钱账户最终收到的金额。
		resMsg.setPayAmount(request.getParameter("payAmount"));
		// 费用，快钱收取商户的手续费，单位为分。
		resMsg.setFee(request.getParameter("fee"));
		// 扩展字段1，该值与提交时相同。
		resMsg.setExt1(request.getParameter("ext1"));
		// 扩展字段2，该值与提交时相同。
		resMsg.setExt2(request.getParameter("ext2"));
		// 处理结果， 10支付成功，11 支付失败，00订单申请成功，01 订单申请失败
		resMsg.setPayResult(request.getParameter("payResult"));
		// 错误代码 ，请参照《人民币网关接口文档》最后部分的详细解释。
		resMsg.setErrCode(request.getParameter("errCode"));
		// 签名字符串
		resMsg.setSignMsg(request.getParameter("signMsg"));
		resMsg.setSignMessage(request.getParameter("signMsg"));
		return resMsg;
	}

	@Override
	protected OrderInfo buildOrderInfo(HttpServletRequest request, Result result) {
		OrderInfo orderInfo = new OrderInfo();
		 KuaiQianResultMessage message = (KuaiQianResultMessage) result.getModel("message");
		if (message != null) {
			if (KuaiQianConstants.PRO_ORDER_SUCCESS.equals(message.getPayResult())) {
				orderInfo.setOrderId(message.getOrderId());
				orderInfo.setAmt(new BigDecimal(message.getPayAmount()).movePointLeft(2).toString());
				orderInfo.setNotifyNum("1");
				orderInfo.setPayStatus("00");
				orderInfo.setRetCode("00");
				orderInfo.setRetMsg("");
				orderInfo.setBankName(BankConstants.BANK_LOGO_KUAIQIAN);
				orderInfo.setNotify(true);
			} else {
				orderInfo.setOrderId(message.getOrderId());
				orderInfo.setAmt(new BigDecimal(message.getPayAmount()).movePointLeft(2).toString());
				orderInfo.setNotifyNum("1");
				orderInfo.setPayStatus("01");
				orderInfo.setRetCode("01");
				orderInfo.setRetMsg("");
				orderInfo.setBankName(BankConstants.BANK_LOGO_KUAIQIAN);
				orderInfo.setNotify(true);
			}
		}
		return orderInfo;
	}

	@Override
	protected boolean checkParameters(HttpServletRequest request) {
		if (StringUtils.isEmpty(request.getParameter("merchantAcctId"))
				|| StringUtils.isEmpty(request.getParameter("version"))
				|| StringUtils.isEmpty(request.getParameter("language"))
				|| StringUtils.isEmpty(request.getParameter("signType"))
				|| StringUtils.isEmpty(request.getParameter("payType"))
				|| StringUtils.isEmpty(request.getParameter("bankId"))
				|| StringUtils.isEmpty(request.getParameter("bankId"))
				|| StringUtils.isEmpty(request.getParameter("orderTime"))
				|| StringUtils.isEmpty(request.getParameter("orderAmount"))
				|| StringUtils.isEmpty(request.getParameter("payResult"))
				|| StringUtils.isEmpty(request.getParameter("signMsg"))) {
			return false;
		}else{
			return true;
		}

	}
}
